package com.lpy.book.aspect;


import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Slf4j  // 打印日志
@Aspect // 声明为切面类，Spring AOP只是用了 aspectj 的注解
@Component // 交给 Spring 管理
public class TimeRecordAspect {

    // 对哪些方法生效 第一个 * 是指 controller 包下的所有类，第二个指所有方法
    @Around("execution(* com.lpy.book.controller.*.*(..))")
    public Object record(ProceedingJoinPoint pj) throws Throwable {
        /*
         * 切面逻辑：
         *  1. 记录开始时间
         *  2. 执行目标方法
         *  3. 记录结束时间
         *  4. 记录消耗时间
         */
        // 1.
        long start = System.currentTimeMillis();

        // 2.
        Object result = pj.proceed();

        // 3.
        long end = System.currentTimeMillis();

        // 4.
        /*
         * pj.getSignature() : 上面路径中的方法
         */
        log.info(pj.getSignature() + "cost time: " + (end - start) + "ms");

        return result;

    }


}
